package com.huanzhidadi.single.completablefuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 帮我们捕捉到所有中间过程的异常，方法会给我们一个异常作为参数，我们可以处理这个异常，同时返回一个默认值，跟服务降级有点像，
 * 默认值的类型和上一个操作的返回值相同。
 * 接收一个可抛出的异常，且必须return一个返回值，类型与入参T一致
 * 向线程池提交任务的时候发生的异常属于外部异常，是无法捕捉到的，毕竟还没有开始执行任务。
 * exceptionally()无法捕捉RejectedExecutionException()
 * CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn)
 */
public class ExceptionallyTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(100);
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            int i = 1 / 0;
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("前置程序子线程：" + Thread.currentThread().getName());
            return "123";
        }, executorService).exceptionally(e -> {
            System.out.println(e.getMessage());
            System.out.println("异常子线程：" + Thread.currentThread().getName());
            return e.getMessage();
        });
        try {
            String s = future.get();
            System.out.println("执行结果：" + s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束：" + Thread.currentThread().getName());
        executorService.shutdown();
    }
}
